
'''
表格内列出了一些常见的文件打开模式以及它对于文件的作用。

模式	描述
b	以二进制模式打开文件。
+	以读写模式打开一个文件。
r	以只读方式打开文件，打开后文件的指针将会放在文件的开头。
rb	以二进制格式打开一个文件用于只读，文件指针将会放在文件的开头。
r+	以读写模式打开一个文件，文件指针将会放在文件的开头。
rb+	以二进制格式打开一个文件用于读写，文件指针将会放在文件的开头。
w	以写模式打开一个文件，如果该文件已存在则打开文件，删除原有文件内容并从开头开始编辑，如果该文件不存在，则创建新文件。
wb	以二进制格式打开一个文件只用于写入，如果该文件已存在则打开文件，删除原有文件内容并从开头开始编辑，如果该文件不存在，则创建新文件。
w+	以读写模式打开一个文件，如果该文件已存在则打开文件，删除原有文件内容并从开头开始编辑，如果该文件不存在，则创建新文件。
wb+	以二进制格式打开一个文件用于读写，如果该文件已存在则打开文件，删除原有文件内容并从开头开始编辑，如果该文件不存在，则创建新文件。
a	以追加模式打开一个文件，如果该文件已存在，文件指针将会放在文件的结尾，将新内容写入到已有内容之后，如果该文件不存在，创建新文件进行写入。
ab	以二进制格式打开一个文件用于追加，如果该文件已存在，文件指针将会放在文件的结尾，将新内容写入到已有内容之后，如果该文件不存在，创建新文件进行写入。
a+	以追加模式打开一个文件，如果该文件已存在，文件指针将会放在文件的结尾，将新内容写入到已有内容之后，如果该文件不存在，创建新文件进行写入。
ab+	以二进制格式打开一个文件用于追加，如果该文件已存在，文件指针将会放在文件的结尾，将新内容写入到已有内容之后，如果该文件不存在，创建新文件进行写入。

'''
# todo 打开和关闭文件
# 打开 'python-100.txt' 文件，如果文件不存在会在程序文件 *.py 所在的目录下创建该文件。
# file = open('python.txt', 'w')
# print('测试1：python.txt 文件已打开。')
# # 关闭已打开的 'python-100.txt' 文件
# file.close()
# print('测试1：python.txt 文件已关闭。')

# with + open() 模式
# with open('python.txt', 'w') as f:
#     print('测试1：python.txt 文件已打开。')
# print('测试1：python.txt 文件已关闭。')

# todo 读取和写入文件内容
'''
读写方法	描述
read()	一次性将文件中的内容全部读取出来，缺点就是文件过大的话很容易导致内存崩溃。
read(n)	一次读取 n 个字符，如果再次读取，会在上一次读取过后的位置接着去读取而不是从头开始读取, 如果使用的是 rb 模式，则读取出来的是 n 个字节。
readline()	一次读取一行内容，每次读取出来的内容都以换行符 ‘\n’ 结尾。
readlines()	一次读取打开文件的全部内容，返回一个列表，每一行内容作为元素放到一个列表中，缺点就是文件内容过大容易出现内存崩溃的问题。
write(s)	写入字符串 s，如果再次写入，会在上一次写入的位置末尾继续写入。
writelines(s)	写入字符串或列表 s，如果是列表的话列表中的所有元素必须为 string 类型，如果再次写入，会在上一次写入的位置末尾继续写入。
'''
# read() 示例 读取文件中的所有内容
# with open('python.txt', 'r', encoding='utf-8') as f:
#     content = f.read()
#     print(content)

#  read(n) 示例 每次读取 n 个字符
# with open('python.txt', 'r', encoding='utf-8') as f:
#     content = f.read(8)
#     print(content)
#
#     content = f.read(8)
#     print(content)
# 以 rb 模式打开本地建立的 python-100.txt 文件，每次读取 n 个字节，注意是字节
# with open('python.txt', 'rb') as f:
#     content = f.read(8)
#     print(content)
#
#     content = f.read(8)
#     print(content)

# readline()示例  每次读取文件中的一行内容，利用 strip() 函数去掉每一行末尾的换行符
# with open('python.txt', 'r', encoding='utf-8') as f:
#     firstLine = f.readline().strip('\n')
#     secondLine = f.readline().strip('\n')
#
#     print(firstLine)
#     print(secondLine)

# readlines() 示例 读取文件中所有内容，以列表形式返回
# with open('python.txt', 'r', encoding='utf-8') as f:
#     content = f.readlines()
#     print(content)
#
#     for line in content:
#         print(line.strip('\n'))

# 循环读取文件内容示例
# with open('python.txt', 'r', encoding='utf-8') as f:
#     for line in f:
#         print(line.strip('\n'))


#### 文件写应用 ####
# 以 r 模式打开本地建立的空文件 python-100.txt(不存在自动创建该文件)，向文件中写入内容并读取
# f = open('python-test.txt', 'w', encoding='utf-8')
# f.write('Python-test\n')
# f.write('坚持100天')
# f.close()
#
# f = open('python-test.txt', 'r', encoding='utf-8')
# print(f.read())
# f.close()

# writelines()示例 以 r 模式打开本地建立的空文件 python-test2.txt，向文件中写入内容并读取
# f = open('python-test2.txt', 'w', encoding='utf-8')
# content = ['Python-test2\n', '坚持100天']
# f.writelines(content)
# f.close()
#
# f = open('python-test2.txt', 'r', encoding='utf-8')
# print(f.read())
# f.close()

# todo 文件内容定位 ###
'''
定位方法	描述
tell()	返回当前文件读取指针在什么位置，按字节数来确定的。
seek(n)	用于移动文件读取指针到指定位置，移动的单位为字节。
'''
# tell() 函数应用示例 以 w 模式打开本地建立的空文件 python-test.txt，获取文件中读取指针的位置
# f = open('python-test.txt', 'w', encoding='utf-8')
#
# print('打开空文件时，指针位置为:', f.tell())
# f.write('Python-test\n' + '坚持100天')  # 'utf-8'编码格式下，换行符占 2 个字节，汉字占 3 个字节
# print('写入内容后，指针位置为:', f.tell())
# f.close()

'''
seek(offset, whence=0) 函数应用示例
offset，移动偏移的字节数，如果是负数表示从倒数第几位开始。
whence，可选参数，默认值为 0。0 代表从文件开头开始算偏移量，1 代表从当前位置开始算，2 代表从文件末尾算起。
'''
# 以 r 模式打开文件 python-100.txt，移动文件中读取指针的位置

f = open('python-test2.txt', 'rb')

print("1.文件内容为:")
print(f.read().decode('utf-8'))

f.seek(6)
print('\n2.偏移量为 12 个字节时，输出内容为:')
print(f.read().decode('utf-8'))

f.seek(-12, 2)
print('\n3.偏移量为 -12 个字节时，输出内容为:')
print(f.read().decode('utf-8'))

print('\n4.在当前指针位置偏移:')
f.seek(12)
print('文件指针当前位置为：', f.tell())
f.seek(-6, 1)
print('文件指针当前位置为：', f.tell())
f.seek(6, 1)
print('文件指针当前位置为：', f.tell())
print(f.read().decode('utf-8'))

f.close()
